Gruppensummenstufenberechnung
Heute mal wieder ein Work-around ganz besonderer Güte: Das Beeinflussen von Gruppensummenstufen. Das ist leider nicht ganz so einfach, wie es sich anhört, da bei einem Refresh des Grids die aufgebauten Gruppenstufen wieder zerstört werden. Also muss ein kleiner Trick herhalten…
Vielen Dank an Stefan, der sich die Mühe gemacht hat, ein Minimaldemo zu erstellen.
Gruppenstufen
Nach dem Start des Demoprogramms erscheint ein “normaler” ALV mit Daten aus der Flugdatenbank:
Bei normaler Summierung und Bildung von Gruppenstufen, gibt es keine Bezeichnung der gebildeten Gruppen:
Die Bildung der Gruppenbezeichnung kann sehr komplex werden. Das Beispiel demonstriert die Bezeichnung der Gruppenstufen im Feld “PLANETYPE”:
Code
REPORT zdemo_alv_summenzeilen. *----------------------------------------------------------------------* * CLASS lcl_helper DEFINITION *----------------------------------------------------------------------* CLASS lcl_helper DEFINITION FINAL. PUBLIC SECTION. CLASS-METHODS: read_data, display, handle_after_user_command FOR EVENT after_user_command OF cl_gui_alv_grid, summenzeilen_anpassen. CLASS-DATA: mo_grid TYPE REF TO cl_gui_alv_grid, mt_data TYPE STANDARD TABLE OF saplane WITH NON-UNIQUE DEFAULT KEY. ENDCLASS. "lcl_helper DEFINITION START-OF-SELECTION. lcl_helper=>read_data( ). END-OF-SELECTION. lcl_helper=>display( ). *----------------------------------------------------------------------* * CLASS lcl_helper IMPLEMENTATION *----------------------------------------------------------------------* CLASS lcl_helper IMPLEMENTATION. METHOD read_data. SELECT * INTO TABLE mt_data FROM saplane. ENDMETHOD. "read_data METHOD display. DATA: ls_variant TYPE disvariant. WRITE:/ 'Wenn man das hier liest, ist ein interner Fehler aufgetreten'. "#EC NOTEXT *--------------------------------------------------------------------* * ALV erzeugen *--------------------------------------------------------------------* CREATE OBJECT mo_grid EXPORTING i_parent = cl_gui_container=>screen0 EXCEPTIONS OTHERS = 1. *--------------------------------------------------------------------* * Event AFTER_USER_COMMAND nutzbar machen * Da sehr viele Usercommands ( auch SAP-Usercommands ) implizit einen * full-refresh des Grid durchführen, müssen wir uns stets dahinter klemmen * um unsere eigene Zwischensummenzeilengenerierung zu erhalten *--------------------------------------------------------------------* SET HANDLER handle_after_user_command FOR mo_grid. *--------------------------------------------------------------------* * Defaultlayouts ermöglichen, um Zwischensummen ohne Userinteraktion zu demonstrieren *--------------------------------------------------------------------* ls_variant-handle = '0001'. ls_variant-report = sy-repid. *--------------------------------------------------------------------* * Anzeigen des grid *--------------------------------------------------------------------* mo_grid->set_table_for_first_display( EXPORTING i_structure_name = 'SAPLANE' is_variant = ls_variant i_save = 'A' i_default = 'X' CHANGING it_outtab = mt_data EXCEPTIONS OTHERS = 1 ). *--------------------------------------------------------------------* * Summen- oder Zwischensummenzeilen manipulieren *--------------------------------------------------------------------* summenzeilen_anpassen( ). ENDMETHOD. "display METHOD handle_after_user_command. *--------------------------------------------------------------------* * SAP hat evtl. noch keinen Refresh gemacht. * Daher würden Änderungen, die in der Methode summenzeilen_anpassen * gemacht und dann mit soft-refresh an den Grid gereicht würden im * Nachgang durch den ausstehenden full-refresh zunichte gemacht, da * der Grid beim full refresh auch die Summen- und Zwischensummenzeilen * neu generiert * Daher wird der full-refresh jetzt explizit vor unserer Anpassung * ausgeführt und der nachfolgende soft_refresh lässt unsere * Summenzeilen stehen. *--------------------------------------------------------------------* mo_grid->refresh_table_display( i_soft_refresh = ' ' ). *--------------------------------------------------------------------* * Summen- oder Zwischensummenzeilen manipulieren *--------------------------------------------------------------------* summenzeilen_anpassen( ). ENDMETHOD. "handle_AFTER_USER_COMMAND METHOD summenzeilen_anpassen. DATA: lr_data_summe TYPE REF TO data, lr_data_zwischensumme TYPE REF TO data, lt_grouplevels TYPE lvc_t_grpl, "#EC NEEDED Normalerweise braucht man das um gezielt die Zwischensummen zu manipulieren lv_tabix TYPE numc2. FIELD-SYMBOLS: <lt_data> LIKE mt_data, <ls_data> LIKE LINE OF <lt_data>. *--------------------------------------------------------------------* * Zwischensummenzeilen holen - *--------------------------------------------------------------------* mo_grid->get_subtotals( IMPORTING ep_collect00 = lr_data_summe " Summenzeile ep_collect01 = lr_data_zwischensumme " Zwischensummenzeile - Stufe 1 * EP_COLLECT02 - EP_COLLECT09 Zwischensummenzeilen - Stufe 2-9 et_grouplevels = lt_grouplevels ). " Informationen welche Zwischensummenzeile(n) zu welchen Gridzeilen gehören *--------------------------------------------------------------------* * Hier kann das jetzt hinreichend komplex werden * Zur Demo werde ich in alle Summen und Zwischensummen im Feld * "PLANETYPE" etwas einfüllen *--------------------------------------------------------------------* IF lr_data_summe IS BOUND. ASSIGN lr_data_summe->* TO <lt_data>. LOOP AT <lt_data> ASSIGNING <ls_data>. lv_tabix = sy-tabix. CONCATENATE 'Stufe1-' lv_tabix INTO <ls_data>-planetype. "#EC NOTEXT ENDLOOP. ENDIF. IF lr_data_zwischensumme IS BOUND. ASSIGN lr_data_zwischensumme->* TO <lt_data>. LOOP AT <lt_data> ASSIGNING <ls_data>. lv_tabix = sy-tabix. CONCATENATE 'Stufe2-' lv_tabix INTO <ls_data>-planetype. "#EC NOTEXT ENDLOOP. ENDIF. *--------------------------------------------------------------------* * ALV-Anzeige neu aufbauen lassen, ohne Zwischensummen vom ALV generieren zu lassen *--------------------------------------------------------------------* mo_grid->refresh_table_display( i_soft_refresh = 'X' ). ENDMETHOD. "summenzeilen_anpassen ENDCLASS. "lcl_helper IMPLEMENTATION
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024